#pragma once
#include "app_sdk_define.h"
namespace app_sdk {
class AppSDKInterface : public nbase::SupportWeakCallback {
public:
    AppSDKInterface() = default;
    ~AppSDKInterface() = default;
    SINGLETON_DEFINE(AppSDKInterface);

    /**
     * 判断是否存在指定的配置项
     * @param[in] key 需要判断的信息关键字
     * @param[in] from_private_setting 公共配置中没有配置时，是否查找私有化配置项
     * @return bool
     */
    static bool HasconfigValue(const std::string& key, bool from_private_setting = true);

    /**
     * 获取连接服务器的某一个配置信息
     * @param[in] key 需要获取的信息关键字
     * @return string 配置信息
     */
    static std::string GetConfigValue(const std::string& key);

    /**
     * 获取配置文件的版本信息
     * @return string 版本
     */
    static int GetConfigFileVersion();

    /**
     * 获取应用的app key
     * @return string 配置信息app key
     */
    static std::string GetAppKey();

    /**
     * 应用的app key是否为网易云信Demo本身的app key
     * @return bool true:是,false:否
     */
    static bool IsNimDemoAppKey(const std::string& appkey);

    /**
     * 判断 URL 是否是安全链接
     * @param[in] safe_url 要检测的 URL
     * @return 返回 true 表示是一个安全短链接，否则为 false
     */
    static bool IsSafeUrl(const std::string& safe_url);

    /**
     * 获取安全连接中需要传递的 Referrer 白名单 URL
     * @return 返回白名单允许的 Referrer URL 地址
     */
    static std::string GetReferrer();

public:
    /**
     * 获取应用发送http请求的host,host与api拼接成一个完整的http请求地址
     * 开发者可以修改为具体应用的host
     * @return string http请求的host
     */
    std::string GetAppHost();

    /**
    * App更新
    */
    void InvokeAppUpdate(const std::string& platform, const OnAppUpdateCallback& cb);

    /**
     * 发送短信
     */
    void InvokeSendCode(const std::string& type, const std::string& mobile, const std::string& pre, const OnSendCodeCallback& cb);

    /**
     * 注册一个新账号
     * @param[in] mobile 手机号
     * @param[in] pre 国家编码需要带+号
     * @param[in] password 用户密码
     * @param[in] code 验证码
     * @param[in] account 用户名（字母/数字4-32位长度）
     * @param[in] deviceid 设备标识
     * @param[in] cb 注册完毕的回调通知函数
     * @return void	无返回值
     */
    void InvokeRegister(const std::string& mobile,
                        const std::string& pre,
                        const std::string& password,
                        const std::string& code,
                        const std::string& account,
                        const std::string& deviceid,
                        const OnRegisterCallback& cb);

    /**
     * 登录
     */
    void InvokeLogin(const std::string& account,
                     const std::string& password,
                     const std::string& deviceid,
                     const OnLoginCallback& cb);

    /**
     * 获取当前登录的用户信息
     */
    void InvokeUserInfo(const OnUserInfoCallback& cb);

    /**
     * 修改用户信息
     * @param[in] signature 个性签名
     * @param[in] nickname 昵称
     * @param[in] avatar 头像
     * @param[in] cb 修改完毕的回调通知函数
     * @return void	无返回值
     */
    void InvokeUserEdit(const std::string& signature,
        const std::string& nickname,
        const std::string& avatar,
        const OnUserEditCallback& cb);

    /**
     * 领取红包
     */
    void InvokeRecvRedPacket(const std::string& pack_id, const std::string& tid, const OnRecvRedPacketCallback& cb);

    /**
     * 查询ACCID
     */
    void InvokeQueryAccid(const std::string& keyword, const OnQueryAccidCallback& cb);

    /**
     * 获取聊天室列表
     * @param[in] cb 回调通知函数
     * @return void	无返回值
     */
    void InvokeGetChatroomList(const OnGetChatroomListCallback& cb);

    /**
     * 获取聊天室连接地址,多用于匿名登录时
     * @param[in] room_id 聊天室ID
     * @param[in] uid 用户UID
     * @param[in] type 进入聊天室的模式 Logined = 1,Anonymous = 2,
     * @param[in] cb 回调通知函数
     * @return void	无返回值
     */
    void InvokeGetChatroomAddress(__int64 room_id, const std::string& uid, int type, const OnGetChatroomAddressCallback& cb);

private:
    static void LoadConfig();
    /**
     * 获取连接服务器的某一个配置信息
     * @param[in] key 需要获取的信息关键字
     * @return string 配置信息
     */
    static std::string GetConfigValueFromMap(const std::string& key);

private:
    static const std::string kAppKey;
    static const std::string kAppHost;
    static std::map<std::string, std::string> config_map_;

public:
    // 用户登录信息
    int user_id;
    std::string user_accid;
    std::string user_token;
    std::string user_yxToken;
    std::string user_avatar;
    std::string user_nickname;
};

}  // namespace app_sdk